package org.example.day02;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 给定一个乱序的数组，删除所有的重复元素，使得每个元素只出现一次，并且按照出现的次数从高到低进行排序，相同出现次数按照第一次出现顺序进行先后排序。
 * @date 2024/3/11 15:22
 */
public class test028 {

    public static List<Integer> removeDuplicates(List<Integer> nums) {
        // 使用 LinkedHashMap 以保持元素插入的顺序
        Map<Integer, Integer> countMap = new LinkedHashMap<>();

        // 统计每个数字的出现次数
        for (Integer num : nums) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        // 将条目转换为列表，以便排序
        List<Map.Entry<Integer, Integer>> countList = new ArrayList<>(countMap.entrySet());

        // 根据出现次数和首次出现顺序对条目进行排序
        countList.sort((a, b) -> {
            int countDiff = b.getValue() - a.getValue();
            if (countDiff != 0) {
                return countDiff;
            }
            return nums.indexOf(a.getKey()) - nums.indexOf(b.getKey());
        });

        // 提取排序后的数字作为最终结果
        List<Integer> result = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : countList) {
            result.add(entry.getKey());
        }

        return result;
    }

    public static void main(String[] args) {
        List<Integer> nums = Arrays.asList(1, 3, 3, 3, 2, 4, 4, 4, 5);

        // 调用函数并输出结果
        List<Integer> result = removeDuplicates(nums);
        String output = result.toString().replaceAll("[\\[\\]\\s]", "");
        System.out.println(output);
    }
}


